﻿using System;
using System.Collections.Generic;
using System.Drawing;

using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;
using Libreria.SICOM.Negocio;
using Libreria.SICOM.Modelo;
using System.Configuration;
using Web.SICOM.Models;
namespace Web.SICOM.Controllers
{
    public class LugarController : Controller
    {
        //
        // GET: /Lugar/

        public ActionResult Index()
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }
            LugarModelo modelo = new LugarModelo();

            LugarNegocio lugarbo = new LugarNegocio();
            TipodeLugarNegocio tipodelugarbo = new TipodeLugarNegocio();
            modelo.lugares = lugarbo.consultarLugares(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);
            modelo.tiposdelugar = tipodelugarbo.consultarTiposdeLugar(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);
            ViewData.Model = modelo;

            if (((LugarModelo)ViewData.Model).lugares.Count == 0)
            {
                if (((LugarModelo)ViewData.Model).tiposdelugar.Count == 0)
                {
                    ViewData.Model = "No Hay Datos de tipos de lugar Asociados";
                }
                ViewData.Model = "No Hay Datos de  lugares Asociados";
            }
            return View();
        }

        public ActionResult Crear()
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }

            LugarModelo modelo = new LugarModelo();

            TipodeLugarNegocio tipodelugarbo = new TipodeLugarNegocio();
            modelo.tiposdelugar = tipodelugarbo.consultarTiposdeLugar(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);
            ViewData.Model = modelo;
            if (((LugarModelo)ViewData.Model).tiposdelugar.Count == 0)
            {
                ViewData.Model = "No Hay Datos de tipos de lugar Asociados";
            }

            return View();
        }


        [HttpPost]
        public ActionResult Insertar(Lugar lugar, int? Gradoslati, int? Minutoslati, int? Segundoslati, int? Decimaslati, string direccionlati, int? Gradoslongi,
            int? Minutoslongi, int? Segundoslongi, int? Decimaslongi, string direccionlongi)
        {
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            List<Lugar> lugares = new LugarNegocio().consultarLugares(cdc);
            for (int i = 0; i <= lugares.Count - 1; i++)
            {
                if (lugares[i].Identificador == lugar.Identificador)
                {
                    ModelState.AddModelError("Identificador", "***El Codigo especificado ya se encuentra en uso***");
                }
                if (lugares[i].Nombre == lugar.Nombre)
                {
                    ModelState.AddModelError("Nombre", "***El Nombre especificado ya se encuentra en uso***");
                }
                if (lugares[i].Latitud == lugar.Latitud)
                {
                    ModelState.AddModelError("Latitud", "***La latitud especificada ya se encuentra en uso***");
                }
                if (lugares[i].Longitud == lugar.Longitud)
                {
                    ModelState.AddModelError("Longitud", "***La longitud especificada ya se encuentra en uso***");
                }
            }
            if (lugar.Idtipodelugar == 0)
            {
                ModelState.AddModelError("Idtipodelugar", "El tipo de lugar no ha sido especificado.");
            }
            if (Gradoslati < 0 || Gradoslati > 90 || Gradoslongi < 0 || Gradoslongi > 180 || Gradoslati.Equals(null) || Gradoslongi.Equals(null))
            {
                ModelState.AddModelError("Latitud", "Especifcacion de grados de coordenadas fuera de rango.");
            }
            if (Minutoslati < 0 || Minutoslati > 59 || Minutoslongi < 0 || Minutoslongi > 59 || Minutoslati.Equals(null) || Minutoslongi.Equals(null))
            {
                ModelState.AddModelError("Longitud", "Especifcacion de minutos de coordenadas fuera de rango.");
            }
            double? seglat = Segundoslati + (Convert.ToDouble(Decimaslati) / 100);
            double? seglong = Segundoslongi + (Convert.ToDouble(Decimaslongi) / 100);
            if (seglat < 0.00 || seglat > 59.99 || seglong < 0.00 || seglong > 59.99 || seglat.Equals(null) || seglong.Equals(null))
            {
                ModelState.AddModelError("Segundos", "Especifcacion de segundos de coordenadas fuera de rango.");
            }
            if (direccionlati == "0" || direccionlongi == "0")
            {
                ModelState.AddModelError("Direccion", "Especificacion de direccion de coordenadas obligatoria");
            }
            if (!ModelState.IsValid)
            {
                LugarModelo modelo = new LugarModelo();
                modelo.tiposdelugar = new TipodeLugarNegocio().consultarTiposdeLugar(cdc);
                ViewData.Model = modelo;
                return View("Crear", ViewData.Model);
            }
            Int32? id = lugar.Identificador;
            String name = lugar.Nombre;
            string latitud = direccionlati + Gradoslati + "°" + " " + Minutoslati + "'" + " " + seglat + '"';
            string longitid = direccionlongi + Gradoslongi + "°" + " " + Minutoslongi + "'" + " " + seglong + '"';
            string latituddef = latitud.Replace(",", ".");
            string longitiddef = longitid.Replace(",", ".");
            String descripcion = lugar.Descripcion;
            Int32? idtipodelugar = lugar.Idtipodelugar;
           
            string latidecimal = direccionlati+(Gradoslati + Math.Round((Minutoslati.Value * 60 + seglat.Value) / 3600, 6)).ToString();
            String longituddecimal = direccionlongi+(Gradoslongi + Math.Round((Minutoslongi.Value * 60 + seglong.Value) / 3600, 6)).ToString();
            string latidecimaldef = latidecimal.Replace(",", ".");
            string longituddecimaldef = longituddecimal.Replace(",", ".");
            new LugarNegocio().CrearLugar(id, name, latituddef, latidecimaldef, longitiddef, longituddecimaldef, null, descripcion, idtipodelugar, cdc);
            return RedirectToAction("Index");
        }


        public ActionResult Editar(Int32? id)
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            LugarModelo modelo = new LugarModelo();
            Lugar lugartemp = new LugarNegocio().ConsultarPorIdentificador(id, cdc);
            //separacion de valores de latitud
            string latitud = lugartemp.Latitud;
            string longitud = lugartemp.Longitud;
            modelo.Latitud = Separarcoordenada(latitud);
            modelo.Longitud = Separarcoordenada(longitud);
            modelo.lugar = lugartemp;
            modelo.tiposdelugar = new TipodeLugarNegocio().consultarTiposdeLugar(cdc);
            ViewData.Model = modelo;
            return View();
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Actualizar(Lugar lugar, int? Gradoslati, int? Minutoslati, int? Segundoslati, int? Decimaslati, string direccionlati, int? Gradoslongi,
            int? Minutoslongi, int? Segundoslongi, int? Decimaslongi, string direccionlongi)
        {
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            Int32? id = lugar.Identificador;
            String name = lugar.Nombre;
            Int32? idtipodelugar = lugar.Idtipodelugar;
            String descripcion = lugar.Descripcion;
            String foto = lugar.Foto;
            if (Gradoslati < 0 || Gradoslati > 90 || Gradoslongi < 0 || Gradoslongi > 180 || Gradoslati.Equals(null) || Gradoslongi.Equals(null))
            {
                ModelState.AddModelError("Latitud", "Especifcacion de grados de coordenadas fuera de rango.");
            }
            if (Minutoslati < 0 || Minutoslati > 59 || Minutoslongi < 0 || Minutoslongi > 59 || Minutoslati.Equals(null) || Minutoslongi.Equals(null))
            {
                ModelState.AddModelError("Longitud", "Especifcacion de minutos de coordenadas fuera de rango.");
            }
            double? seglat = Segundoslati + (Convert.ToDouble(Decimaslati) / 100);
            double? seglong = Segundoslongi + (Convert.ToDouble(Decimaslongi) / 100);
            if (seglat < 0.00 || seglat > 59.99 || seglong < 0.00 || seglong > 59.99 || seglat.Equals(null) || seglong.Equals(null))
            {
                ModelState.AddModelError("Segundos", "Especifcacion de segundos de coordenadas fuera de rango.");
            }
            if (direccionlati == "0" || direccionlongi == "0")
            {
                ModelState.AddModelError("Direccion", "Especificacion de direccion de coordenadas obligatoria");
            }
            if (!ModelState.IsValid)
            {
                LugarModelo modelo = new LugarModelo();
                modelo.lugar = lugar;
                modelo.tiposdelugar = new TipodeLugarNegocio().consultarTiposdeLugar(cdc);
                string[] latitude = { Gradoslati.ToString(), Minutoslati.ToString(), Segundoslati.ToString(), Decimaslati.ToString(), direccionlati };
                string[] longitude = { Gradoslongi.ToString(), Minutoslongi.ToString(), Segundoslongi.ToString(), Decimaslongi.ToString(), direccionlongi };
                modelo.Latitud = latitude;
                modelo.Longitud = longitude;
                ViewData.Model = modelo;
                return View("Editar", ViewData.Model);
            }
            string latitud = direccionlati + Gradoslati + "°" + " " + Minutoslati + "'" + " " + seglat + '"';
            string longitud = direccionlongi + Gradoslongi + "°" + " " + Minutoslongi + "'" + " " + seglong + '"';
            string latituddef = latitud.Replace(",", ".");
            string longitiddef = longitud.Replace(",", ".");
            string latidecimal = direccionlati + (Gradoslati + Math.Round((Minutoslati.Value * 60 + seglat.Value) / 3600, 6)).ToString();
            String longituddecimal = direccionlongi + (Gradoslongi + Math.Round((Minutoslongi.Value * 60 + seglong.Value) / 3600, 6)).ToString();
            string latidecimaldef = latidecimal.Replace(",", ".");
            string longituddecimaldef = longituddecimal.Replace(",", ".");
            new LugarNegocio().ActualizarLugar(id, name, latituddef, latidecimaldef, longitiddef, longituddecimaldef, foto, descripcion, idtipodelugar, cdc);
            return RedirectToAction("Index");
        }


        public ActionResult Eliminar(Lugar nuevolugar)
        {

            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }
            Int32? id = nuevolugar.Identificador;
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            List<Muestra> listademuestras = new List<Muestra>();
            Muestra muestra = new Muestra(cdc);
            muestra.Identificador = null;
            muestra.Idtipodemuestra = null;
            muestra.Iddeproyecto = null;
            muestra.Iddelugar = id;
            muestra.Fechadecaptura = DateTime.MinValue;
            muestra.Codigoderesponsable = null;
            muestra.Mac = null;
            muestra.Iddeequipo = null;
            muestra.Iddevariable = null;
            muestra.Valor = null;
            listademuestras = muestra.consultar();
            if (listademuestras.Count == 0)
            {
                new LugarNegocio().eliminarLugar(id, null, 0, 0, 0, cdc);
                return RedirectToAction("Index");
            }

            ModelState.AddModelError("Identificador", " No se puede eliminar el Lugar especificado, se encuentra en uso.");
            LugarModelo modelo = new LugarModelo();
            modelo.lugares = new LugarNegocio().consultarLugares(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);
            modelo.tiposdelugar = new TipodeLugarNegocio().consultarTiposdeLugar(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);
            ViewData.Model = modelo;
            return View("Index", ViewData.Model);
        }

        public ActionResult FormFileupload(Lugar Lugar)
        {
            Int32? id = Lugar.Identificador;
            @ViewData["id"] = id;
            return View(ViewData);
        }

        [HttpPost]
        public ActionResult UploadFile(HttpPostedFileBase hidFileID, int? idlugar)
        {
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            string[] fototemporal = hidFileID.FileName.Split('.');
            String foto = idlugar + "." + fototemporal[1];
            var path = Path.Combine(Server.MapPath("~/Content/img/lugar"), foto);

            Lugar lugar = new LugarNegocio().ConsultarPorIdentificador(idlugar,cdc);
            if (lugar.Foto != null)
            {
                System.IO.File.Delete(Server.MapPath("~/Content/img/lugar/") + lugar.Foto);
            }
            lugar.Foto = foto;
            new LugarNegocio().ActualizarLugar(idlugar, lugar.Nombre, lugar.Latitud, lugar.Latituddecimal,lugar.Longitud,lugar.Longituddecimal, lugar.Foto, lugar.Descripcion, lugar.Idtipodelugar, cdc);
            Imagen imagenmod = new Imagen();
            var resizedImage = imagenmod.ResizeImage(hidFileID, new Size(102, 100));
            imagenmod.SaveImage(resizedImage, path);

            return RedirectToAction("Index");
        }

        private string[] Separarcoordenada(string coordenada)
        {
            string[] result = new string[5];
            string[] coordenadatemp = coordenada.Split(' ');
            result[0] = Regex.Replace(coordenadatemp[0], @"[^\d]", "");
            result[1] = Regex.Replace(coordenadatemp[1], @"[^\d]", "");
            string seconds = coordenadatemp[2];
            string[] secondstemporal = seconds.Split('.');
            result[2] = secondstemporal[0];
            result[3] = Regex.Replace(secondstemporal[1], @"[^\d]", "");
            if (coordenadatemp[0].Contains("+"))
            {
                result[4] = "1";
            }
            else
            {
                result[4] = "2";
            }
            return result;
        }





    }
}
